/* eslint-disable @typescript-eslint/no-var-requires */
const path = require('path');
const webpack = require('webpack');
// fork-ts-checker-webpack-plugin需要单独安装
const ForkTsCheckerWebpackPlugin = require('fork-ts-checker-webpack-plugin');
const TsconfigPathsPlugin = require('tsconfig-paths-webpack-plugin');
// const { BundleAnalyzerPlugin } = require('webpack-bundle-analyzer');
const nodeExternals = require('webpack-node-externals');

const JavaScriptObfuscator = require('webpack-obfuscator');

module.exports = {
  entry: './src/main',
  //   mode: 'production', // 新增生产模式标识
  target: 'node',
  // 置为空即可忽略webpack-node-externals插件
  // externals: {},
  externals: [
    // 添加需要忽略的模块
    // nodeExternals(),
    // 'vertx',
    // 'hiredis',
    // 其他模块
  ],
  // ts文件的处理
  module: {
    rules: [
      {
        test: /\.ts?$/,
        use: {
          loader: 'ts-loader',
          options: { transpileOnly: true },
        },
        exclude: [/node_modules/, /test/, /\.spec\.ts$/],
      },
    ],
  },
  stats: {
    errorDetails: true,
  },
  // 打包后的文件名称以及位置
  output: {
    filename: 'main.js',
    path: path.resolve(__dirname, 'distOut'),
  },
  optimization: {
    usedExports: false,
  },
  resolve: {
    extensions: ['.js', '.ts', '.json'],
    plugins: [new TsconfigPathsPlugin({ configFile: './tsconfig.json' })],
    // modules: [path.resolve(__dirname, 'node_modules')]
    alias: {
      // 如果有必要，可以为特定模块设置别名
      './binary_parser': path.resolve(
        __dirname,
        'node_modules/_bson@0.4.23@bson/lib/bson/binary_parser',
      ),
      './binary': path.resolve(__dirname, 'node_modules/bson/lib/bson/binary'),
      // 其他模块...
    },
  },
  plugins: [
    // 需要进行忽略的插件
    new webpack.IgnorePlugin({
      checkResource(resource) {
        const lazyImports = [
          '@nestjs/microservices',
          '@nestjs/microservices/microservices-module',
          '@nestjs/websockets/socket-module',
          'cache-manager',
          'class-validator',
          'class-transformer',
          'class-transformer/storage',
          'ordered-read-streams',
        ];
        if (!lazyImports.includes(resource)) {
          return false;
        }
        try {
          require.resolve(resource, {
            paths: [process.cwd()],
          });
        } catch (err) {
          return true;
        }
        return false;
      },
    }),
    new ForkTsCheckerWebpackPlugin(),
    // 新增代码混淆插件
    // new JavaScriptObfuscator({
    //   compact: false, // 压缩代码为单行格式（默认开启）
    //   controlFlowFlattening: true, // 控制流平坦化（使代码执行流程难以追踪）
    //   // deadCodeInjection: false, // 注入无效代码（可能引发意外错误）
    //   debugProtection: true, // 阻止调试器附加（会生成debugger保护代码）
    //   disableConsoleOutput: true, // 禁用所有console输出（安全场景建议开启）
    //   // identifierNamesGenerator: 'hexadecimal', // 标识符命名方式（十六进制格式）log: true, // 关闭混淆器的控制台日志
    //   // numbersToExpressions: true, // 数字转算术表达式（如123→0x7B）
    //   // renameGlobals: false, // 重命名全局变量（需注意第三方库兼容性）
    //   // selfDefending: true, // 生成自保护代码（防止格式化/美化）
    //   // simplify: true, // 简化代码结构（配合压缩使用）
    //   // splitStrings: true, // 拆分字符串（如"Hello"→"H"+"e"+"l"+"l"+"o"）
    //   // stringArray: false, // 启用字符串数组加密
    //   stringArrayThreshold: 0.1, // 字符串加密阈值（0-1，值越大加密越多）
    //   // transformObjectKeys: false, // 转换对象键（如{key:1}→{_0x123:1}）
    //   // unicodeEscapeSequence: false, // 使用Unicode转义字符串（如"a"→"\x61"）
    // }),
    // new BundleAnalyzerPlugin()
  ],
};
